/************************************************************
 * Project Name         [Thinking_In_Java]
 * File Name            [Example_04_Array.java]
 * Creation Date        [20-Jun-2014]
 * 
 * Copyright© ge.y.yang@gmail.com All Rights Reserved
 * 
 * Work hard, play harder, think big and keep fit
 ************************************************************/
package pkg_04_reflection;

import java.lang.reflect.Array;

/**
 * 反射 - 数组
 * 
 * @author 不落的太阳(Sean Yang)
 * @version 1.0
 * @since JDK 6
 * 
 */
public class Example_04_Array {

	/**
	 * 数组拷贝
	 * 
	 * @param array
	 *            待拷贝的数组
	 * @return 拷贝后的新数组
	 */
	public static Object arrayCopy(Object array) {
		Object copiedArray = null;

		if (array == null) {
			return null;
		}

		Class<?> classType = array.getClass();
		// 检测传入的对象是数组
		if (!classType.isArray()) {
			return null;
		}

		// 检测数组的具体类型
		Class<?> componentType = classType.getComponentType();
		// 获得原数组的长度
		int length = Array.getLength(array);
		// 构建新数组的长度
		int newLength = length * 11 / 10 + 10;
		// 使用新长度构建数组
		copiedArray = Array.newInstance(componentType, newLength);
		// 拷贝原数组内容到新数组中
		System.arraycopy(array, 0, copiedArray, 0, Math.min(length, newLength));

		return copiedArray;
	}

	/**
	 * 迭代输出数组
	 * 
	 * @param array
	 *            需要迭代输出的数组
	 */
	public static void iterator(Object array) {
		Class<?> classType = array.getClass();
		if (!classType.isArray()) {
			System.out.println("参数不是数组类型");
			return;
		}

		Class<?> componentType = classType.getComponentType();
		int length = Array.getLength(array);
		System.out.print(componentType.getSimpleName() + "[" + length + "]{");
		for (int i = 0; i < length; i++) {
			if (i != (length - 1)) {
				System.out.print(Array.get(array, i) + ", ");
			} else {
				System.out.print(Array.get(array, i));
			}
		}
		System.out.println("}");
	}

	/**
	 * 测试方法
	 * 
	 * @param args
	 *            命令行参数
	 */
	public static void main(String[] args) {
		// 拷贝int数组
		int[] intArray = new int[] { 1, 2, 3, 4, 5 };
		Example_04_Array.iterator(intArray);

		int[] copiedIntArray = (int[]) Example_04_Array.arrayCopy(intArray);
		Example_04_Array.iterator(copiedIntArray);

		// 拷贝String数组
		String[] strArray = new String[] { "It", " ", "is", " ", "a", " ",
				"nice", " ", "day" };
		Example_04_Array.iterator(strArray);

		String[] copiedStrArray = (String[]) Example_04_Array
				.arrayCopy(strArray);
		Example_04_Array.iterator(copiedStrArray);

		/*
		 * 创建了一个5 * 10 * 15的整型数组, 把索引位置为[3][5][10]的元素设置为50
		 */
		int[] dims = new int[] { 5, 10, 15 };
		// 上面的数组是下面反射产生的实例数组的维度, 3维的长度分别是5, 10, 15
		Object array = Array.newInstance(Integer.TYPE, dims);
		// array1现在实际上是二维数组
		Object array1 = Array.get(array, 3);
		// array2现在实际上是一维数组
		Object array2 = Array.get(array1, 5);
		Array.setInt(array2, 10, 50);

		int[][][] arrayCast = (int[][][]) array;
		System.out.println(arrayCast[3][5][10]);
	}

}
